/**
 * 设备状态监听 Mixin
 * 为页面组件提供设备状态监听能力
 */
import deviceStore from '@/store/deviceStore.js'
import mqttApi from '@/api/my-mqtt.js'

export default {
  data() {
    return {
      deviceStatusUnsubscribe: null // 设备状态监听取消函数
    }
  },

  async created() {
    // 添加设备状态监听器（不再自己初始化MQTT，使用App.vue的全局连接）
    this.deviceStatusUnsubscribe = deviceStore.addListener((deviceSn, status) => {
      this.onDeviceStatusChange(deviceSn, status)
    })
    
    console.log('[DeviceStatusMixin] 设备状态监听已启动')
  },

  beforeDestroy() {
    // 取消设备状态监听
    if (this.deviceStatusUnsubscribe) {
      this.deviceStatusUnsubscribe()
      console.log('[DeviceStatusMixin] 设备状态监听已停止')
    }
  },

  methods: {
    /**
     * 设备状态变化回调
     * 子组件可以重写此方法来处理状态变化
     * @param {string} deviceSn 设备序列号
     * @param {Object} status 设备状态
     */
    onDeviceStatusChange(deviceSn, status) {
      console.log(`[DeviceStatusMixin] 设备状态变化: ${deviceSn}`, status)
      // 子组件重写此方法来处理具体的状态变化
    },

    /**
     * 获取设备当前状态
     * @param {string} deviceSn 设备序列号
     * @returns {Object|undefined} 设备状态
     */
    getDeviceCurrentStatus(deviceSn) {
      return deviceStore.getDeviceStatus(deviceSn)
    },

    /**
     * 检查设备是否在线
     * @param {string} deviceSn 设备序列号
     * @returns {boolean} 是否在线
     */
    isDeviceOnline(deviceSn) {
      return deviceStore.isDeviceOnline(deviceSn)
    },

    /**
     * 获取设备当前播放的图案
     * @param {string} deviceSn 设备序列号
     * @returns {Object|null} 当前播放图案信息
     */
    getCurrentPattern(deviceSn) {
      return deviceStore.getCurrentPattern(deviceSn)
    },

    /**
     * 检查设备是否正在播放图案
     * @param {string} deviceSn 设备序列号
     * @returns {boolean} 是否正在播放
     */
    isPatternPlaying(deviceSn) {
      return deviceStore.isPatternPlaying(deviceSn)
    },

    /**
     * 获取所有设备状态
     * @returns {Object} 所有设备状态
     */
    getAllDevicesStatus() {
      return deviceStore.getAllDevicesStatus()
    },

    /**
     * 强制刷新MQTT连接（用于调试）
     */
    async refreshMqttConnection() {
      try {
        mqttApi.disconnect()
        await new Promise(resolve => setTimeout(resolve, 1000)) // 等待1秒
        await this.ensureMqttConnection()
      } catch (error) {
        console.error('[DeviceStatusMixin] 刷新MQTT连接失败:', error)
      }
    }
  }
}
